package com.yc.anno;

import java.lang.annotation.*;
import java.lang.reflect.Method;

@Select
@Test
public class Demo2 {
    // 数组属性(单值), 可以省略 { }
    @Select(value = 2000, friends = "abc")
    private String name;

    // 单属性, 省略 value
    @Select(2000)
    private String gender;

    @Select
    @Test
    private void test(){

    }

    public static void main(String[] args) throws Exception {
        Method m = Demo2.class.getDeclaredMethod("test");
        // 获取方法上的注解对象
        System.out.println("---------------保持性测试---------------");
        System.out.println(m.getAnnotation(Test.class));
        System.out.println(m.getAnnotation(Select.class));

        System.out.println("---------------继承性测试---------------");
        System.out.println(Demo3.class.getAnnotation(Test.class));
        System.out.println(Demo3.class.getAnnotation(Select.class));
    }


}

/**
 * CLASS 编译期有效
 */
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.CLASS)
@interface Test {

}

// 注解继承性
@Inherited
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.TYPE})
/**
 * RUNTIME 运行时有效
 */
@Retention(RetentionPolicy.RUNTIME)
@interface Select {
    // 定义注解的属性 : 必有返回值
    String name() default "abc";

    // 默认属性值 可以省略不写
    // 如果属性名为 value 那么就是改注解默认属性, 默认属性(单属性值状态)可以省略属性名
    int value() default 100;

    String[] friends() default {};
}

class Demo3 extends Demo2{

}